﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using ControleEstoque.Data;
using Microsoft.SqlServer.Server;

namespace ControleEstoque.Data
{
	public static class Movimentacao
	{
		public static void InsertEstoqueAtualizacao(SqlConnection connection, DataRow movimentacaoRow)
		{
			using (SqlCommand command = new SqlCommand(EstoqueLocalizacao.Insert, connection))
			{
				command.Parameters.Add(new SqlParameter("estoqueLocalizacaoRFID", movimentacaoRow["EstoqueLocalizacaoRFID"]));
				command.Parameters.Add(new SqlParameter("ativoId", movimentacaoRow["AtivoId"]));
				command.Parameters.Add(new SqlParameter("localArmazenagemId", movimentacaoRow["LocalArmazenagemId"]));
				command.Parameters.Add(new SqlParameter("estoqueLocalizacaoRFIDPai", movimentacaoRow["EstoqueLocalizacaoRFIDPai"]));
				command.Parameters.Add(new SqlParameter("estoqueLocalizacaoTamanhoCaixa", movimentacaoRow["estoqueLocalizacaoTamanhoCaixa"]));
				command.Parameters.Add(new SqlParameter("estoqueLocalizacaoDataValidade", movimentacaoRow["MovimentacaoDataValidade"]));
				command.Parameters.Add(new SqlParameter("estoqueLocalizacaoQuantidade", movimentacaoRow["MovimentacaoQuantidade"]));
				command.Parameters.Add(new SqlParameter("estoqueLocalizacaoHierarquia", ""));
				command.Parameters.Add(new SqlParameter("estoqueLocalizacaoLote", movimentacaoRow["MovimentacaoLote"]));

				command.ExecuteNonQuery();
			}
		}

		public static void UpdateEstoqueAtualizacao(SqlConnection connection, DataRow movimentacaoRow)
		{
		}

		public static void DeleteEstoqueAtualizacao(SqlConnection connection, DataRow movimentacaoRow)
		{
		}

		public static void AtualizarEstoque(SqlConnection conn, DataRow inserted)
		{
			if (!DBNull.Value.Equals(inserted["AtivoId"]) && !inserted["MovimentacaoTipo"].Equals("R"))
			{
				using (SqlCommand command = new SqlCommand())
				{
					command.Connection = conn;
					command.Parameters.Add(new SqlParameter("localArmazenagemId", inserted["LocalArmazenagemId"]));
					command.Parameters.Add(new SqlParameter("ativoId", inserted["AtivoId"]));

					DataTable estoque = new DataTable();

					command.CommandText = "SELECT * FROM Estoque WHERE LocalArmazenagemId = @localArmazenagemId AND AtivoId = @ativoId";

					using (SqlDataAdapter adapter = new SqlDataAdapter(command))
					{
						adapter.Fill(estoque);
					}

					if (estoque.Rows.Count == 0)
					{
						if (inserted["MovimentacaoTipo"].Equals("E"))
						{
							command.CommandText = "INSERT INTO Estoque (AtivoId, LocalArmazenagemId, EstoqueAtual, EstoqueMinimo) VALUES (@ativoId, @localArmazenagemId, @movimentacaoQuantidade, 0)";
						}
						else if (inserted["MovimentacaoTipo"].Equals("S"))
						{
							command.CommandText = "INSERT INTO Estoque (AtivoId, LocalArmazenagemId, EstoqueAtual, EstoqueMinimo) VALUES (@ativoId, @localArmazenagemId, -1 * @movimentacaoQuantidade, 0)";
						}
					}
					else
					{
						if (inserted["MovimentacaoTipo"].Equals("E"))
						{
							command.CommandText = "UPDATE Estoque SET EstoqueAtual = EstoqueAtual + @movimentacaoQuantidade WHERE LocalArmazenagemId = @localArmazenagemId AND AtivoId = @ativoId";
						}
						else if (inserted["MovimentacaoTipo"].Equals("S"))
						{
							command.CommandText = "UPDATE Estoque SET EstoqueAtual = EstoqueAtual - @movimentacaoQuantidade WHERE LocalArmazenagemId = @localArmazenagemId AND AtivoId = @ativoId";
						}
					}

					command.Parameters.Add(new SqlParameter("movimentacaoQuantidade", inserted["MovimentacaoQuantidade"]));


					command.ExecuteNonQuery();

				}
			}
		}

		[Microsoft.SqlServer.Server.SqlTrigger(Name = "AtualizaEstoqueLocalizacao", Target = "Movimentacao", Event = "INSTEAD OF INSERT")]
		public static void AtualizaEstoqueLocalizacao()
		{
			switch (SqlContext.TriggerContext.TriggerAction)
			{
				case TriggerAction.Insert:

					using (SqlConnection conn = new SqlConnection(@"context connection=true"))
					{
						conn.Open();

						using (SqlCommand command = new SqlCommand("SELECT * FROM INSERTED", conn))
						{

							SqlDataAdapter adapter = new SqlDataAdapter(command);
							DataTable inserted = new DataTable();

							adapter.Fill(inserted);

							switch (inserted.Rows[0]["MovimentacaoTipo"].ToString())
							{
								case "E":
									Movimentacao.InsertEstoqueAtualizacao(conn, inserted.Rows[0]);
									break;
								case "S":
									Movimentacao.UpdateEstoqueAtualizacao(conn, inserted.Rows[0]);
									break;
								case "R":
									Movimentacao.DeleteEstoqueAtualizacao(conn, inserted.Rows[0]);
									break;
							}

						}

						int? movimentacaoIdPai = null;

						using (SqlCommand command = new SqlCommand(@"SELECT MovimentacaoId
FROM Movimentacao
WHERE EXISTS (SELECT * FROM INSERTED WHERE Movimentacao.EstoqueLocalizacaoRFID = INSERTED.EstoqueLocalizacaoRFIDPai
	AND Movimentacao.MovimentacaoData = INSERTED.MovimentacaoData)", conn))
						{
							movimentacaoIdPai = command.ExecuteScalar() as int?;
						}

						using (SqlCommand command = new SqlCommand(@"INSERT INTO [ControleAtivo].[dbo].[Movimentacao]
           ([LocalArmazenagemId]
			,[AtivoId]
           ,[EstoqueLocalizacaoRFID]
           ,[EstoqueLocalizacaoRFIDPai]
           ,[MovimentacaoIdPai]
           ,[MovimentacaoData]
           ,[MovimentacaoLote]
           ,[MovimentacaoQuantidade]
           ,[MovimentacaoTipo]
           ,[MovimentacaoDataValidade]
           ,[EstoqueLocalizacaoTamanhoCaixa])
     SELECT
			LocalArmazenagemId
			,AtivoId
           ,EstoqueLocalizacaoRFID
           ,EstoqueLocalizacaoRFIDPai
           ,@movimentacaoIdPai
           ,MovimentacaoData
           ,MovimentacaoLote
           ,MovimentacaoQuantidade
           ,MovimentacaoTipo
           ,MovimentacaoDataValidade
           ,EstoqueLocalizacaoTamanhoCaixa
	FROM INSERTED", conn))
						{
							command.Parameters.Add(new SqlParameter("movimentacaoIdPai", movimentacaoIdPai == null ? (object)DBNull.Value : (object)movimentacaoIdPai));
							SqlContext.Pipe.ExecuteAndSend(command);
						}


						conn.Close();
					}
					break;
				default:
					break;
			}
		}

		[Microsoft.SqlServer.Server.SqlTrigger(Name = "AtualizaEstoque", Target = "Movimentacao", Event = "FOR INSERT")]
		public static void AtualizaEstoque()
		{
			using (SqlConnection conn = new SqlConnection(@"context connection=true"))
			{
				conn.Open();

				DataTable inserted = new DataTable();
				using (SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM INSERTED", conn))
				{
					adapter.Fill(inserted);
				}

				Movimentacao.AtualizarEstoque(conn, inserted.Rows[0]);

				conn.Close();
			}
		}
	}
}
